/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package propres;

//~--- JDK imports ------------------------------------------------------------
import java.util.*;

/**
 *
 * @author neochange
 */
import java.io.Serializable;

public class plato implements Serializable {

    private int Calorias;
    private String Nombre;
    private List al;    // lista con los alimentos
    private boolean pagado;
    private int precio;
    private String clas; // el plato es principal, secundario, acompañamiento
    private int com; // el plato se puede usar en las diferentes comidas 11111=todas
    ///el bit menor pertenece al desayuno(00001) y el mayor a la cena(10000) 
    public plato() {
        al = new ArrayList();
    }

    public plato(String nom, String[] b, estrucalim Z) {

//      {Pre: El plato tiene un alimento principal y un secundario}
        al = new ArrayList();

        alimento c;
        int cal = 0;
        int prec = 0;
        int i = 0;

        Nombre = nom;
        c = Z.consultar_alimento(b[i]);

        while (i < b.length) {
            if (i != 0) {
                c = Z.consultar_alimento(b[i]);
            }

            al.add(b[i]);
            prec += c.Get_Precio();      // ((Integer.parseInt(b[i+1]))/100);
            cal += c.Get_Calorias();    // *((Integer.parseInt(b[i+1]))/100);

            // al.add(b[i+1]);
            // i+=2;

            int val = c.Get_tipopla();

            if (c.Get_clasificacion().equals("principal")) {
                // hay que modificar clas para saber si el plato es principal,sec,acomp.
                if ((val / 100) % 10 == 1) {
                    clas = "principal";
                } else if ((val / 10) % 10 == 1) {
                    clas = "secundario";
                } else {
                    clas = "acomp";
                }
            }
            i++;
        }

        if (b.length == 1) {
            clas = "principal";
        }

        int al1[] = Z.consultar_alimento(b[0]).Get_comida();
        int al2[] = Z.consultar_alimento(b[1]).Get_comida();


        Calorias = cal;
        pagado = false;
        precio = prec;
        int exp = 1;
        int coms = 0;
        i = 0;
        while (i < 5) {

            if (al1[i] == al2[i] && al1[i] == 1) {
                coms = coms + exp;

            }

            exp = exp * 10;
            i++;
        }
        com = coms;

    }

    public void copiar_plato(plato p) {
        Calorias = p.Calorias;
        Nombre = p.Nombre;

        al.addAll(p.al);    // lista con los alimentos y su % en el plato.
        pagado = p.pagado;
        precio = p.precio;
        clas = p.clas;
        com = p.com;

    }

    public void modificar_plato(String[] b, estrucalim Z) {
        al = new ArrayList();

        alimento c;
        int cal = 0;
        int prec = 0;
        int i = 0;

        c = Z.consultar_alimento(b[i]);

        while (i < b.length) {
            c = Z.consultar_alimento(b[i]);
            al.add(b[i]);
            prec += c.Get_Precio();
            cal += c.Get_Calorias();


            if (c.Get_clasificacion().equals("principal")) {
                int val = c.Get_tipopla();
                // hay que modificar clas para saber si el plato es principal,sec,acomp.
                if ((val / 100) % 10 == 1) {
                    clas = "principal";
                } else if ((val / 10) % 10 == 1) {
                    clas = "secundario";
                } else {
                    clas = "acomp";
                }
            }

            i++;
        }



        Calorias = cal;
        pagado = false;
        precio = prec;



    }

    public String Get_Nombre() {
        return Nombre;
    }

    public int Get_Calorias() {
        return Calorias;
    }

    public int Get_Precio() {
        return precio;
    }

    public boolean Get_pagado() {
        return pagado;

    }
    
    public List<String> lista_compo(){
    return al;
    }

    public String Get_clas() {
        return clas;
    }

    public int[] get_comida() {
        int n = com;
        int i = 0;
        int[] vect = new int[5];
        while (i < 5) {
            vect[i] = n % 10;
            i++;
            n = n / 10;
        }
        return vect;
    }

    public void Set_pagado() {
        pagado = true;
    }

    public boolean equals(Object arg) {

        if ((arg != null) && (arg instanceof plato)) {
            // Hacemos un moldeado del Object general a tipo java511
            plato temp = (plato) arg;
            // Se realiza la comparacion y se devuelve el resultado

            return (Nombre.equals(temp.Nombre));
        } else {

            return (false);
        }
    }

    List<plato> platos_rest(List<plato> p1, preferencias pref) {
        List<plato> l1 = new ArrayList();
        Iterator it = p1.iterator();
        int n = 0;
        int r;
        boolean b = true;
        plato p = new plato();
        List<String> l2 = new ArrayList();
        if (pref == null) {
            l1 = p1;
        } // comprovamos que no tenga prefs inicializadas
        else {
            l2.addAll(pref.Consultar_restricciones_platos());
            while (it.hasNext()) {
                Iterator et = l2.iterator();
                r = 0;
                b = true;
                while (et.hasNext()) {
                    if (p1.get(n).contiene(l2.get(r))) {
                        b = false;
                    }
                    et.next();
                    r++;
                }
                if (b) {

                    l1.add(p1.get(n));
                }
                it.next();
                n++;
            }

        }
        return l1;
    }

    public boolean tip_com(int n) {
        int[] pla = get_comida();
        boolean b = false;
        if (pla[n] == 1) {
            b = true;
        }
        return b;
    }

    public boolean contiene(String alimento) {

        return (al.get(0).equals(alimento) || al.get(1).equals(alimento));
    }

    plato platos_min(List<plato> p1, preferencias pref) {
        List<plato> l1 = new ArrayList();
        if (pref != null) {
            int n = 0;
            boolean b = true;
            plato p = new plato();
            List<String> l2 = new ArrayList();
            l2.addAll(pref.Consultar_necesidades_platos());
            Iterator it = p1.iterator();
            if (p1.size() > l2.size()) {
                // p1.removeAll(l2);
                Iterator et = l2.iterator();
                while (et.hasNext()) {
                    it = p1.iterator();
                    int i = 0;
                    b = true;
                    while (it.hasNext() && b) {
                        if (p1.get(i).Get_Nombre().equals(l2.get(n))) {
                            p1.remove(p1.get(i));

                            b = false;
                        }
                        it.next();
                        i++;
                    }


                    et.next();
                    n++;
                }
            }
            it = p1.iterator();
            p = p1.get(0);
            it.next();
            n = 1;
            while (it.hasNext()) {
                if (p1.get(n).Get_Calorias() - p.Get_Calorias() > 0 && p1.get(n).Get_Precio() - p.Get_Precio() > 0) {
                    p = new plato();
                    p = p1.get(n);
                }


                it.next();
                n++;
            }



            return p;
        } else {
            return p1.get(0);
        }

    }

    int get_ncom(List<plato> list, int com) {
        Iterator it = list.iterator();
        int n = 0;
        int res = 0;
        while (it.hasNext()) {
            int[] vec = list.get(n).get_comida();
            if (vec[com] == 1) {
                res++;

            }
            it.next();
            n++;
        }
        return res;
    }
}



